library(ggplot2)

df = subset(insurance, select = -c(region))
head(df,4)

Think Business: Framing the business problem:-

The given data set provides us with the age, sex, BMI( providing an understanding of body, weights that are relatively high or low relative to height) and number of children covered for the given individual along with their Individual medical costs billed by health insurance

Understand Data: Data source identification and understanding:-

The above data is collected from the website kaggle(Medical Cost Personal Data sets) link: https://www.kaggle.com/datasets/mirichoi0218/insurance?resource=download The data set gives us insight on how the health and other factors can have major impact on the insurance a person is buying and how is the insurance companies going to pay an individuals medical expenses in the future.Also this study will also help us to identify how to lower the charges by selecting the clients based on their lifestyle(BMI, age, smoker etc).

##UNDERSTANDING DATA

Describe your data in terms of the following aspects: concept of learning: in the given data set, there are 4 input independent parameters and one dependent parameter, we can presume it as a problem which can be solved using linear regression with multiple variables

Data Attributws:

colnames(df)
[1] "age"      "sex"      "bmi"      "children" "smoker"   "charges" 

The given data set has 5 attributes- age, sex, bmi, children, and smoker namely. Also the target variable is charges. age: age of primary beneficiary sex: insurance contractor gender, female, male bmi: Body mass index, providing an understanding of body, weights that are relatively high or low relative to height, objective index of body weight (kg / m ^ 2) using the ratio of height to weight, ideally 18.5 to 24.9 children: Number of children covered by health insurance / Number of dependents smoker: if the primary benificiary smokes or not charges: Individual medical costs billed by health insurance

head(df, 1)

In this instance of the data, primary benificary is a 19 year old female, her BMI is 27.9 and has 0 children’s/ number of dependents. She does smokes and her charges were 16884.92$.

Data in Action: Data preparation, visualization and exploration

counting the number of different parameters in data frame

table(df['sex'])
sex
female   male 
   662    676 
table(df['children'])
children
  0   1   2   3   4   5 
574 324 240 157  25  18 
table(df['smoker'])
smoker
  no  yes 
1064  274 
ggplot(df, aes(x=sex)) + geom_bar()

the graph shows us that there are almost equal number of data points for both male and females, which are taken in the dataset.

ggplot(df, aes(x = children)) +geom_bar()

the categorical data suggests that the maximum number of people had 0 childrens covered by the insurance, followed by 1,2,3,4,5 childrens

ggplot(df, aes(x = smoker)) +geom_bar()

the category suggests that the people who opted for the insurance to cover the charges, maximum of them were non smokers.

hist(df$charges)

data distribution with log transformation the above histogram shows us that the most of the users have their charges in the range of 0 to 15,000$.

hist(log(df$charges))

after taking the log of charges, we can clearly see that the distribution becomes fairly gaussian.

plot(df$bmi, df$age ,xlab="bmi of customer", ylab="age of customer", pch=19,col = "orange")

plot(df$bmi, df$charges ,xlab="bmi of customer", ylab="charges of customer", pch=19,col = "orange")

drawing a scatter plot of bmi and log(charges)

plot(df$bmi, log(df$charges) ,xlab="bmi of customer", ylab="log of charges of customer", pch=19,col = "orange")

while for most of the bmi in range 0 to 30 the charges remained typically in the range of 0 to 20,000, for some bmi in the range of 30-50 the charges went up from the range of 40,000$ to 60,000+$’s

summary(df)
      age            sex                 bmi           children        smoker         
 Min.   :18.00   Length:1338        Min.   :15.96   Min.   :0.000   Length:1338       
 1st Qu.:27.00   Class :character   1st Qu.:26.30   1st Qu.:0.000   Class :character  
 Median :39.00   Mode  :character   Median :30.40   Median :1.000   Mode  :character  
 Mean   :39.21                      Mean   :30.66   Mean   :1.095                     
 3rd Qu.:51.00                      3rd Qu.:34.69   3rd Qu.:2.000                     
 Max.   :64.00                      Max.   :53.13   Max.   :5.000                     
    charges     
 Min.   : 1122  
 1st Qu.: 4740  
 Median : 9382  
 Mean   :13270  
 3rd Qu.:16640  
 Max.   :63770  
boxplot(df$charges)

analysing the boxplot for charges shows us again, where most of the data is concentrated

boxplot(df$children)

analysing the boxplot we get that most of the people get 0-2 childrens covered under their insurance

boxplot(df$bmi)

analysing the density of the charges

plot(density(df$charges))

plotting log(charges)

plot(density(log(df$charges)))

plotting charges by age

plot(df$age, df$charges ,xlab="age of customer", ylab="charges of customer", pch=19, col = "orange")

plotting age with log of charges for each customer

plot(df$age, log(df$charges) ,xlab="age of customer", ylab="log of charges of customer", pch=19, col = "orange")

cor(df$bmi, df$charges,  method = "pearson", use = "complete.obs")
[1] 0.198341

By using the pearsons coefficient, bmi and charges are only 0.19 correlated.

cor(df$age, df$charges,  method = "spearman", use = "complete.obs")
[1] 0.5343921

By using the spearman’s coefficient formula, the correlation is 0.534, thus somewhat co-related.

x <- df$age
y <- df$charges
# Plot with main and axis titles
# Change point shape (pch = 19) and remove frame.
plot(x, y, main = "Main title",
     xlab = "age", ylab = "charges",
     pch = 19, frame = FALSE)

# Add regression line
plot(x, y, main = "Main title",
     xlab = "age", ylab = "charges",
     pch = 19, frame = FALSE)
abline(lm(y ~ x, data = df), col = "red")

the red line poorly fits the data, Also the data looks very scattered to be drawing a linear relationship between age and charges. plotting the linear regression line to fit the data for 2 attributes at a time

plotting a regression line between age and log(charges)

x <- df$age
y <- log(df$charges)
# Plot with main and axis titles
# Change point shape (pch = 19) and remove frame.
plot(x, y, main = "Main title",
     xlab = "age", ylab = "log of charges",
     pch = 19, frame = FALSE)

# Add regression line
plot(x, y, main = "Main title",
     xlab = "age", ylab = "log of charges",
     pch = 19, frame = FALSE)
abline(lm(y ~ x, data = df), col = "red")

cor(df$age, df$charges,  method = "pearson", use = "complete.obs")
[1] 0.2990082

This tells us that age and charges are slightly related with pearsons correlation of 0.299

cor(df$age, df$charges,  method = "spearman", use = "complete.obs")
[1] 0.5343921

By using the spearman’s coefficient formula, the correlation is 0.534, thus somewhat co-related.

x <- df$bmi
y <- df$charges
# Plot with main and axis titles
# Change point shape (pch = 19) and remove frame.
plot(x, y, main = "Main title",
     xlab = "bmi", ylab = "charges",
     pch = 19, frame = FALSE)

# Add regression line
plot(x, y, main = "Main title",
     xlab = "bmi", ylab = "charges",
     pch = 19, frame = FALSE)
abline(lm(y ~ x, data = df), col = "red")

plotting a graph between bmi and log(charges)

x <- df$bmi
y <- log(df$charges)
# Plot with main and axis titles
# Change point shape (pch = 19) and remove frame.
plot(x, y, main = "Main title",
     xlab = "bmi", ylab = "log of charges",
     pch = 19, frame = FALSE)

# Add regression line
plot(x, y, main = "Main title",
     xlab = "bmi", ylab = "log of charges",
     pch = 19, frame = FALSE)
abline(lm(y ~ x, data = df), col = "red")

the red line poorly fits the data, Also the data looks very scattered to be drawing a linear relationship between bmi and charges.

##solving multiple linear regression on the data set

model <- lm(charges ~ age + sex + bmi + children + smoker, data = df)
summary(model)

Call:
lm(formula = charges ~ age + sex + bmi + children + smoker, data = df)

Residuals:
     Min       1Q   Median       3Q      Max 
-11837.2  -2916.7   -994.2   1375.3  29565.5 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -12052.46     951.26 -12.670  < 2e-16 ***
age            257.73      11.90  21.651  < 2e-16 ***
sexmale       -128.64     333.36  -0.386 0.699641    
bmi            322.36      27.42  11.757  < 2e-16 ***
children       474.41     137.86   3.441 0.000597 ***
smokeryes    23823.39     412.52  57.750  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6070 on 1332 degrees of freedom
Multiple R-squared:  0.7497,    Adjusted R-squared:  0.7488 
F-statistic:   798 on 5 and 1332 DF,  p-value: < 2.2e-16
summary(model)$coefficients
               Estimate Std. Error     t value     Pr(>|t|)
(Intercept) -12052.4620  951.26043 -12.6699919 8.099035e-35
age            257.7350   11.90389  21.6513323 2.593679e-89
sexmale       -128.6399  333.36051  -0.3858881 6.996412e-01
bmi            322.3642   27.41860  11.7571362 1.954711e-30
children       474.4111  137.85580   3.4413577 5.967197e-04
smokeryes    23823.3925  412.52338  57.7504052 0.000000e+00
sigma(model)/mean(df$charges)
[1] 0.4573875
confint(model)
                  2.5 %      97.5 %
(Intercept) -13918.5939 -10186.3301
age            234.3826    281.0874
sexmale       -782.6087    525.3290
bmi            268.5759    376.1526
children       203.9730    744.8493
smokeryes    23014.1262  24632.6589

#the equation would be y = intercept + 257.7350age + -128.6399sex + 322.3642bmi + 474.4111children + 23823.392

Discussion, understanding, and planning

With the given problem, concepts and objectives, various concepts and relations can be learned from the data. We can learn about how the medical charges of a person are not correlated. From the regression lines drawn between BMI and charges or age and charges, it is clear that simple multivariate regression can not be used to draw a conclusion out of the data. from calculating the pearson’s and spearman’s correlation we can also see that the data like age, bmi and charges are not correlated

From the results and EDA observed, data does seems to be in the normal range, as we can see from the histogram of charges and histogram of log charges(somewhat bell curve).

Log transformation of charges data seems a plausible change that can help us predict better results. but there should be either additional data or additional requirements to predict better results for the model.

According to the current data analysis, linear regression is not an optimal method to find solution for this problem.

nrow(df)
[1] 1338

there are 1338 data points in the data set, this might be possibly enough to make a prediction.

the current data has attributes which have a very less correlation with the dependent attribute, thus we might need additional independent attributes to make better predictions.

LS0tCnRpdGxlOiAiSU5GTzY1OSBBc3NpZ25tZW50IDEiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCgpkZiA9IHN1YnNldChpbnN1cmFuY2UsIHNlbGVjdCA9IC1jKHJlZ2lvbikpCmhlYWQoZGYsNCkKYGBgCgojIyBUaGluayBCdXNpbmVzczogRnJhbWluZyB0aGUgYnVzaW5lc3MgcHJvYmxlbTotCgpUaGUgZ2l2ZW4gZGF0YSBzZXQgcHJvdmlkZXMgdXMgd2l0aCB0aGUgYWdlLCBzZXgsIEJNSSggcHJvdmlkaW5nIGFuIHVuZGVyc3RhbmRpbmcgb2YgYm9keSwgCndlaWdodHMgdGhhdCBhcmUgcmVsYXRpdmVseSBoaWdoIG9yIGxvdyByZWxhdGl2ZSB0byBoZWlnaHQpIGFuZCBudW1iZXIgb2YgY2hpbGRyZW4gY292ZXJlZCBmb3IgdGhlIGdpdmVuIGluZGl2aWR1YWwgYWxvbmcgd2l0aCB0aGVpciBJbmRpdmlkdWFsIG1lZGljYWwgY29zdHMgYmlsbGVkIGJ5IGhlYWx0aCBpbnN1cmFuY2UKClVuZGVyc3RhbmQgRGF0YTogRGF0YSBzb3VyY2UgaWRlbnRpZmljYXRpb24gYW5kIHVuZGVyc3RhbmRpbmc6LSAKClRoZSBhYm92ZSBkYXRhIGlzIGNvbGxlY3RlZCBmcm9tIHRoZSB3ZWJzaXRlIGthZ2dsZShNZWRpY2FsIENvc3QgUGVyc29uYWwgRGF0YSBzZXRzKSBsaW5rOiBodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL21pcmljaG9pMDIxOC9pbnN1cmFuY2U/cmVzb3VyY2U9ZG93bmxvYWQKVGhlIGRhdGEgc2V0IGdpdmVzIHVzIGluc2lnaHQgb24gaG93IHRoZSBoZWFsdGggYW5kIG90aGVyIGZhY3RvcnMgY2FuIGhhdmUgbWFqb3IgaW1wYWN0IG9uIHRoZSBpbnN1cmFuY2UgYSBwZXJzb24gaXMgYnV5aW5nIGFuZCBob3cgaXMgdGhlIGluc3VyYW5jZSBjb21wYW5pZXMgZ29pbmcgdG8gcGF5IGFuIGluZGl2aWR1YWxzIG1lZGljYWwgZXhwZW5zZXMgaW4gdGhlIGZ1dHVyZS5BbHNvIHRoaXMgc3R1ZHkgd2lsbCBhbHNvIGhlbHAgdXMgdG8gaWRlbnRpZnkgaG93IHRvIGxvd2VyIHRoZSBjaGFyZ2VzIGJ5IHNlbGVjdGluZyB0aGUgY2xpZW50cyBiYXNlZCBvbiB0aGVpciBsaWZlc3R5bGUoQk1JLCBhZ2UsIHNtb2tlciBldGMpLgoKIyNVTkRFUlNUQU5ESU5HIERBVEEKCkRlc2NyaWJlIHlvdXIgZGF0YSBpbiB0ZXJtcyBvZiB0aGUgZm9sbG93aW5nIGFzcGVjdHM6IApjb25jZXB0IG9mIGxlYXJuaW5nOiBpbiB0aGUgZ2l2ZW4gZGF0YSBzZXQsIHRoZXJlIGFyZSA0IGlucHV0IGluZGVwZW5kZW50IHBhcmFtZXRlcnMgYW5kIG9uZSBkZXBlbmRlbnQgcGFyYW1ldGVyLCB3ZSBjYW4gcHJlc3VtZSBpdCBhcyBhIHByb2JsZW0gd2hpY2ggY2FuIGJlIHNvbHZlZCB1c2luZyBsaW5lYXIgcmVncmVzc2lvbiB3aXRoIG11bHRpcGxlIHZhcmlhYmxlcwoKRGF0YSBBdHRyaWJ1dHdzOgpgYGB7cn0KY29sbmFtZXMoZGYpCmBgYApUaGUgZ2l2ZW4gZGF0YSBzZXQgaGFzIDUgYXR0cmlidXRlcy0gYWdlLCBzZXgsIGJtaSwgY2hpbGRyZW4sIGFuZCBzbW9rZXIgbmFtZWx5LiBBbHNvIHRoZSB0YXJnZXQgdmFyaWFibGUgaXMgY2hhcmdlcy4KYWdlOiBhZ2Ugb2YgcHJpbWFyeSBiZW5lZmljaWFyeQpzZXg6IGluc3VyYW5jZSBjb250cmFjdG9yIGdlbmRlciwgZmVtYWxlLCBtYWxlCmJtaTogQm9keSBtYXNzIGluZGV4LCBwcm92aWRpbmcgYW4gdW5kZXJzdGFuZGluZyBvZiBib2R5LCB3ZWlnaHRzIHRoYXQgYXJlIHJlbGF0aXZlbHkgaGlnaCBvciBsb3cgcmVsYXRpdmUgdG8gaGVpZ2h0LApvYmplY3RpdmUgaW5kZXggb2YgYm9keSB3ZWlnaHQgKGtnIC8gbSBeIDIpIHVzaW5nIHRoZSByYXRpbyBvZiBoZWlnaHQgdG8gd2VpZ2h0LCBpZGVhbGx5IDE4LjUgdG8gMjQuOQpjaGlsZHJlbjogTnVtYmVyIG9mIGNoaWxkcmVuIGNvdmVyZWQgYnkgaGVhbHRoIGluc3VyYW5jZSAvIE51bWJlciBvZiBkZXBlbmRlbnRzCnNtb2tlcjogaWYgdGhlIHByaW1hcnkgYmVuaWZpY2lhcnkgc21va2VzIG9yIG5vdApjaGFyZ2VzOiBJbmRpdmlkdWFsIG1lZGljYWwgY29zdHMgYmlsbGVkIGJ5IGhlYWx0aCBpbnN1cmFuY2UKCmBgYHtyfQpoZWFkKGRmLCAxKQpgYGAKSW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgZGF0YSwgcHJpbWFyeSBiZW5pZmljYXJ5IGlzIGEgMTkgeWVhciBvbGQgZmVtYWxlLCBoZXIgQk1JIGlzIDI3LjkgYW5kIApoYXMgMCBjaGlsZHJlbidzLyBudW1iZXIgb2YgZGVwZW5kZW50cy4gU2hlIGRvZXMgc21va2VzIGFuZCBoZXIgY2hhcmdlcyB3ZXJlIDE2ODg0LjkyJC4KCiMgRGF0YSBpbiBBY3Rpb246IERhdGEgcHJlcGFyYXRpb24sIHZpc3VhbGl6YXRpb24gYW5kIGV4cGxvcmF0aW9uIAoKY291bnRpbmcgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgcGFyYW1ldGVycyBpbiBkYXRhIGZyYW1lCgpgYGB7cn0KdGFibGUoZGZbJ3NleCddKQp0YWJsZShkZlsnY2hpbGRyZW4nXSkKdGFibGUoZGZbJ3Ntb2tlciddKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGYsIGFlcyh4PXNleCkpICsgZ2VvbV9iYXIoKQpgYGAKdGhlIGdyYXBoIHNob3dzIHVzIHRoYXQgdGhlcmUgYXJlIGFsbW9zdCBlcXVhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgZm9yIGJvdGggbWFsZSBhbmQgZmVtYWxlcywgCndoaWNoIGFyZSB0YWtlbiBpbiB0aGUgZGF0YXNldC4KCmBgYHtyfQpnZ3Bsb3QoZGYsIGFlcyh4ID0gY2hpbGRyZW4pKSArZ2VvbV9iYXIoKQpgYGAKCnRoZSBjYXRlZ29yaWNhbCBkYXRhIHN1Z2dlc3RzIHRoYXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBlb3BsZSBoYWQgMCBjaGlsZHJlbnMKY292ZXJlZCBieSB0aGUgaW5zdXJhbmNlLCBmb2xsb3dlZCBieSAxLDIsMyw0LDUgY2hpbGRyZW5zCgpgYGB7cn0KZ2dwbG90KGRmLCBhZXMoeCA9IHNtb2tlcikpICtnZW9tX2JhcigpCmBgYAoKdGhlIGNhdGVnb3J5IHN1Z2dlc3RzIHRoYXQgdGhlIHBlb3BsZSB3aG8gb3B0ZWQgZm9yIHRoZSBpbnN1cmFuY2UgdG8gY292ZXIgdGhlIGNoYXJnZXMsIG1heGltdW0gb2YgdGhlbSB3ZXJlIG5vbiBzbW9rZXJzLgoKYGBge3J9Cmhpc3QoZGYkY2hhcmdlcykKYGBgCgpkYXRhIGRpc3RyaWJ1dGlvbiB3aXRoIGxvZyB0cmFuc2Zvcm1hdGlvbiB0aGUgYWJvdmUgaGlzdG9ncmFtIHNob3dzIHVzIHRoYXQgdGhlIG1vc3Qgb2YgdGhlIHVzZXJzIGhhdmUgdGhlaXIgY2hhcmdlcyBpbiB0aGUgcmFuZ2Ugb2YgMCB0byAxNSwwMDAkLgoKYGBge3J9Cmhpc3QobG9nKGRmJGNoYXJnZXMpKQpgYGAKCgoKCmFmdGVyIHRha2luZyB0aGUgbG9nIG9mIGNoYXJnZXMsIHdlIGNhbiBjbGVhcmx5IHNlZSB0aGF0IHRoZSBkaXN0cmlidXRpb24gYmVjb21lcyBmYWlybHkgZ2F1c3NpYW4uCgpgYGB7cn0KcGxvdChkZiRibWksIGRmJGFnZSAseGxhYj0iYm1pIG9mIGN1c3RvbWVyIiwgeWxhYj0iYWdlIG9mIGN1c3RvbWVyIiwgcGNoPTE5LGNvbCA9ICJvcmFuZ2UiKQpgYGAKCmBgYHtyfQpwbG90KGRmJGJtaSwgZGYkY2hhcmdlcyAseGxhYj0iYm1pIG9mIGN1c3RvbWVyIiwgeWxhYj0iY2hhcmdlcyBvZiBjdXN0b21lciIsIHBjaD0xOSxjb2wgPSAib3JhbmdlIikKYGBgCmRyYXdpbmcgYSBzY2F0dGVyIHBsb3Qgb2YgYm1pIGFuZCBsb2coY2hhcmdlcykKYGBge3J9CnBsb3QoZGYkYm1pLCBsb2coZGYkY2hhcmdlcykgLHhsYWI9ImJtaSBvZiBjdXN0b21lciIsIHlsYWI9ImxvZyBvZiBjaGFyZ2VzIG9mIGN1c3RvbWVyIiwgcGNoPTE5LGNvbCA9ICJvcmFuZ2UiKQoKYGBgCgoKCndoaWxlIGZvciBtb3N0IG9mIHRoZSBibWkgaW4gcmFuZ2UgMCB0byAzMCB0aGUgY2hhcmdlcyByZW1haW5lZCB0eXBpY2FsbHkgaW4gdGhlIHJhbmdlIG9mIDAgdG8gMjAsMDAwLCBmb3Igc29tZSBibWkgaW4gdGhlIHJhbmdlIG9mIDMwLTUwIHRoZSBjaGFyZ2VzIHdlbnQgdXAgZnJvbSB0aGUgcmFuZ2Ugb2YgNDAsMDAwJCB0byA2MCwwMDArJCdzCiAKYGBge3J9CnN1bW1hcnkoZGYpCmBgYApgYGB7cn0KYm94cGxvdChkZiRjaGFyZ2VzKQpgYGAKYW5hbHlzaW5nIHRoZSBib3hwbG90IGZvciBjaGFyZ2VzIHNob3dzIHVzIGFnYWluLCB3aGVyZSBtb3N0IG9mIHRoZSBkYXRhIGlzIGNvbmNlbnRyYXRlZAoKYGBge3J9CmJveHBsb3QoZGYkY2hpbGRyZW4pCgpgYGAKYW5hbHlzaW5nIHRoZSBib3hwbG90IHdlIGdldCB0aGF0IG1vc3Qgb2YgdGhlIHBlb3BsZSBnZXQgMC0yIGNoaWxkcmVucyBjb3ZlcmVkIHVuZGVyIHRoZWlyIGluc3VyYW5jZQoKYGBge3J9CmJveHBsb3QoZGYkYm1pKQoKYGBgCgphbmFseXNpbmcgdGhlIGRlbnNpdHkgb2YgdGhlIGNoYXJnZXMKYGBge3J9CnBsb3QoZGVuc2l0eShkZiRjaGFyZ2VzKSkKYGBgCnBsb3R0aW5nIGxvZyhjaGFyZ2VzKQpgYGB7cn0KcGxvdChkZW5zaXR5KGxvZyhkZiRjaGFyZ2VzKSkpCmBgYApwbG90dGluZyBjaGFyZ2VzIGJ5IGFnZQoKYGBge3J9CnBsb3QoZGYkYWdlLCBkZiRjaGFyZ2VzICx4bGFiPSJhZ2Ugb2YgY3VzdG9tZXIiLCB5bGFiPSJjaGFyZ2VzIG9mIGN1c3RvbWVyIiwgcGNoPTE5LCBjb2wgPSAib3JhbmdlIikKCmBgYApwbG90dGluZyBhZ2Ugd2l0aCBsb2cgb2YgY2hhcmdlcyBmb3IgZWFjaCBjdXN0b21lcgpgYGB7cn0KcGxvdChkZiRhZ2UsIGxvZyhkZiRjaGFyZ2VzKSAseGxhYj0iYWdlIG9mIGN1c3RvbWVyIiwgeWxhYj0ibG9nIG9mIGNoYXJnZXMgb2YgY3VzdG9tZXIiLCBwY2g9MTksIGNvbCA9ICJvcmFuZ2UiKQpgYGAKCgpgYGB7cn0KY29yKGRmJGJtaSwgZGYkY2hhcmdlcywgIG1ldGhvZCA9ICJwZWFyc29uIiwgdXNlID0gImNvbXBsZXRlLm9icyIpCmBgYApCeSB1c2luZyB0aGUgcGVhcnNvbnMgY29lZmZpY2llbnQsIGJtaSBhbmQgY2hhcmdlcyBhcmUgb25seSAwLjE5IGNvcnJlbGF0ZWQuIAoKYGBge3J9CmNvcihkZiRhZ2UsIGRmJGNoYXJnZXMsICBtZXRob2QgPSAic3BlYXJtYW4iLCB1c2UgPSAiY29tcGxldGUub2JzIikKCmBgYApCeSB1c2luZyB0aGUgc3BlYXJtYW4ncyBjb2VmZmljaWVudCBmb3JtdWxhLCB0aGUgY29ycmVsYXRpb24gaXMgMC41MzQsIHRodXMgc29tZXdoYXQgY28tcmVsYXRlZC4KCgoKYGBge3J9CnggPC0gZGYkYWdlCnkgPC0gZGYkY2hhcmdlcwojIFBsb3Qgd2l0aCBtYWluIGFuZCBheGlzIHRpdGxlcwojIENoYW5nZSBwb2ludCBzaGFwZSAocGNoID0gMTkpIGFuZCByZW1vdmUgZnJhbWUuCnBsb3QoeCwgeSwgbWFpbiA9ICJNYWluIHRpdGxlIiwKICAgICB4bGFiID0gImFnZSIsIHlsYWIgPSAiY2hhcmdlcyIsCiAgICAgcGNoID0gMTksIGZyYW1lID0gRkFMU0UpCiMgQWRkIHJlZ3Jlc3Npb24gbGluZQpwbG90KHgsIHksIG1haW4gPSAiTWFpbiB0aXRsZSIsCiAgICAgeGxhYiA9ICJhZ2UiLCB5bGFiID0gImNoYXJnZXMiLAogICAgIHBjaCA9IDE5LCBmcmFtZSA9IEZBTFNFKQphYmxpbmUobG0oeSB+IHgsIGRhdGEgPSBkZiksIGNvbCA9ICJyZWQiKQpgYGAKdGhlIHJlZCBsaW5lIHBvb3JseSBmaXRzIHRoZSBkYXRhLCBBbHNvIHRoZSBkYXRhIGxvb2tzIHZlcnkgc2NhdHRlcmVkIHRvIGJlIGRyYXdpbmcgYSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gYWdlIGFuZCBjaGFyZ2VzLiBwbG90dGluZyB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbGluZSB0byBmaXQgdGhlIGRhdGEgZm9yIDIgYXR0cmlidXRlcyBhdCBhIHRpbWUKCnBsb3R0aW5nIGEgcmVncmVzc2lvbiBsaW5lIGJldHdlZW4gYWdlIGFuZCBsb2coY2hhcmdlcykKYGBge3J9CnggPC0gZGYkYWdlCnkgPC0gbG9nKGRmJGNoYXJnZXMpCiMgUGxvdCB3aXRoIG1haW4gYW5kIGF4aXMgdGl0bGVzCiMgQ2hhbmdlIHBvaW50IHNoYXBlIChwY2ggPSAxOSkgYW5kIHJlbW92ZSBmcmFtZS4KcGxvdCh4LCB5LCBtYWluID0gIk1haW4gdGl0bGUiLAogICAgIHhsYWIgPSAiYWdlIiwgeWxhYiA9ICJsb2cgb2YgY2hhcmdlcyIsCiAgICAgcGNoID0gMTksIGZyYW1lID0gRkFMU0UpCiMgQWRkIHJlZ3Jlc3Npb24gbGluZQpwbG90KHgsIHksIG1haW4gPSAiTWFpbiB0aXRsZSIsCiAgICAgeGxhYiA9ICJhZ2UiLCB5bGFiID0gImxvZyBvZiBjaGFyZ2VzIiwKICAgICBwY2ggPSAxOSwgZnJhbWUgPSBGQUxTRSkKYWJsaW5lKGxtKHkgfiB4LCBkYXRhID0gZGYpLCBjb2wgPSAicmVkIikKYGBgCgoKCmBgYHtyfQpjb3IoZGYkYWdlLCBkZiRjaGFyZ2VzLCAgbWV0aG9kID0gInBlYXJzb24iLCB1c2UgPSAiY29tcGxldGUub2JzIikKYGBgClRoaXMgdGVsbHMgdXMgdGhhdCBhZ2UgYW5kIGNoYXJnZXMgYXJlIHNsaWdodGx5IHJlbGF0ZWQgd2l0aCBwZWFyc29ucyBjb3JyZWxhdGlvbiBvZiAwLjI5OQoKYGBge3J9CmNvcihkZiRhZ2UsIGRmJGNoYXJnZXMsICBtZXRob2QgPSAic3BlYXJtYW4iLCB1c2UgPSAiY29tcGxldGUub2JzIikKCmBgYApCeSB1c2luZyB0aGUgc3BlYXJtYW4ncyBjb2VmZmljaWVudCBmb3JtdWxhLCB0aGUgY29ycmVsYXRpb24gaXMgMC41MzQsIHRodXMgc29tZXdoYXQgY28tcmVsYXRlZC4KCgpgYGB7cn0KeCA8LSBkZiRibWkKeSA8LSBkZiRjaGFyZ2VzCiMgUGxvdCB3aXRoIG1haW4gYW5kIGF4aXMgdGl0bGVzCiMgQ2hhbmdlIHBvaW50IHNoYXBlIChwY2ggPSAxOSkgYW5kIHJlbW92ZSBmcmFtZS4KcGxvdCh4LCB5LCBtYWluID0gIk1haW4gdGl0bGUiLAogICAgIHhsYWIgPSAiYm1pIiwgeWxhYiA9ICJjaGFyZ2VzIiwKICAgICBwY2ggPSAxOSwgZnJhbWUgPSBGQUxTRSkKIyBBZGQgcmVncmVzc2lvbiBsaW5lCnBsb3QoeCwgeSwgbWFpbiA9ICJNYWluIHRpdGxlIiwKICAgICB4bGFiID0gImJtaSIsIHlsYWIgPSAiY2hhcmdlcyIsCiAgICAgcGNoID0gMTksIGZyYW1lID0gRkFMU0UpCmFibGluZShsbSh5IH4geCwgZGF0YSA9IGRmKSwgY29sID0gInJlZCIpCmBgYApwbG90dGluZyBhIGdyYXBoIGJldHdlZW4gYm1pIGFuZCBsb2coY2hhcmdlcykKYGBge3J9CnggPC0gZGYkYm1pCnkgPC0gbG9nKGRmJGNoYXJnZXMpCiMgUGxvdCB3aXRoIG1haW4gYW5kIGF4aXMgdGl0bGVzCiMgQ2hhbmdlIHBvaW50IHNoYXBlIChwY2ggPSAxOSkgYW5kIHJlbW92ZSBmcmFtZS4KcGxvdCh4LCB5LCBtYWluID0gIk1haW4gdGl0bGUiLAogICAgIHhsYWIgPSAiYm1pIiwgeWxhYiA9ICJsb2cgb2YgY2hhcmdlcyIsCiAgICAgcGNoID0gMTksIGZyYW1lID0gRkFMU0UpCiMgQWRkIHJlZ3Jlc3Npb24gbGluZQpwbG90KHgsIHksIG1haW4gPSAiTWFpbiB0aXRsZSIsCiAgICAgeGxhYiA9ICJibWkiLCB5bGFiID0gImxvZyBvZiBjaGFyZ2VzIiwKICAgICBwY2ggPSAxOSwgZnJhbWUgPSBGQUxTRSkKYWJsaW5lKGxtKHkgfiB4LCBkYXRhID0gZGYpLCBjb2wgPSAicmVkIikKYGBgCgoKCnRoZSByZWQgbGluZSBwb29ybHkgZml0cyB0aGUgZGF0YSwgQWxzbyB0aGUgZGF0YSBsb29rcyB2ZXJ5IHNjYXR0ZXJlZCB0byBiZSBkcmF3aW5nIGEgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJtaSBhbmQgY2hhcmdlcy4KCiMjc29sdmluZyBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBvbiB0aGUgZGF0YSBzZXQKCmBgYHtyfQptb2RlbCA8LSBsbShjaGFyZ2VzIH4gYWdlICsgc2V4ICsgYm1pICsgY2hpbGRyZW4gKyBzbW9rZXIsIGRhdGEgPSBkZikKc3VtbWFyeShtb2RlbCkKYGBgCmBgYHtyfQpzdW1tYXJ5KG1vZGVsKSRjb2VmZmljaWVudHMKCmBgYAoKYGBge3J9CnNpZ21hKG1vZGVsKS9tZWFuKGRmJGNoYXJnZXMpCgpgYGAKCmBgYHtyfQpjb25maW50KG1vZGVsKQoKYGBgCgojdGhlIGVxdWF0aW9uIHdvdWxkIGJlIAp5ID0gaW50ZXJjZXB0ICsgMjU3LjczNTAqYWdlICsgLTEyOC42Mzk5KnNleCArIDMyMi4zNjQyKmJtaSArIDQ3NC40MTExKmNoaWxkcmVuICsgMjM4MjMuMzkyCgojIERpc2N1c3Npb24sIHVuZGVyc3RhbmRpbmcsIGFuZCBwbGFubmluZwoKV2l0aCB0aGUgZ2l2ZW4gcHJvYmxlbSwgIGNvbmNlcHRzIGFuZCBvYmplY3RpdmVzLCB2YXJpb3VzIGNvbmNlcHRzIGFuZCByZWxhdGlvbnMgY2FuIGJlIGxlYXJuZWQgZnJvbSB0aGUgZGF0YS4gV2UgY2FuIGxlYXJuIGFib3V0IGhvdyB0aGUgbWVkaWNhbCBjaGFyZ2VzIG9mIGEgcGVyc29uIGFyZSBub3QgY29ycmVsYXRlZC4gRnJvbSB0aGUgcmVncmVzc2lvbiBsaW5lcyBkcmF3biBiZXR3ZWVuIEJNSSBhbmQgY2hhcmdlcyBvciBhZ2UgYW5kIGNoYXJnZXMsIGl0IGlzIGNsZWFyIHRoYXQgc2ltcGxlIG11bHRpdmFyaWF0ZSByZWdyZXNzaW9uIGNhbiBub3QgYmUgdXNlZCB0byBkcmF3IGEgY29uY2x1c2lvbiBvdXQgb2YgdGhlIGRhdGEuIGZyb20gY2FsY3VsYXRpbmcgdGhlIHBlYXJzb24ncyBhbmQgc3BlYXJtYW4ncyBjb3JyZWxhdGlvbiB3ZSBjYW4gYWxzbyBzZWUgdGhhdCB0aGUgZGF0YSBsaWtlIGFnZSwgYm1pIGFuZCBjaGFyZ2VzIGFyZSBub3QgY29ycmVsYXRlZAoKRnJvbSB0aGUgcmVzdWx0cyBhbmQgRURBIG9ic2VydmVkLCAgZGF0YSBkb2VzIHNlZW1zIHRvIGJlIGluIHRoZSBub3JtYWwgcmFuZ2UsIGFzIHdlIGNhbiBzZWUgZnJvbSB0aGUgaGlzdG9ncmFtIG9mIGNoYXJnZXMgYW5kIGhpc3RvZ3JhbSBvZiBsb2cgY2hhcmdlcyhzb21ld2hhdCBiZWxsIGN1cnZlKS4KCkxvZyB0cmFuc2Zvcm1hdGlvbiBvZiBjaGFyZ2VzIGRhdGEgc2VlbXMgYSBwbGF1c2libGUgY2hhbmdlIHRoYXQgY2FuIGhlbHAgdXMgcHJlZGljdCBiZXR0ZXIgcmVzdWx0cy4gYnV0IHRoZXJlIHNob3VsZCBiZSBlaXRoZXIgYWRkaXRpb25hbCBkYXRhIG9yIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIHRvIHByZWRpY3QgYmV0dGVyIHJlc3VsdHMgZm9yIHRoZSBtb2RlbC4KCkFjY29yZGluZyB0byB0aGUgY3VycmVudCBkYXRhIGFuYWx5c2lzLCBsaW5lYXIgcmVncmVzc2lvbiBpcyBub3QgYW4gb3B0aW1hbCBtZXRob2QgdG8gZmluZCBzb2x1dGlvbiBmb3IgdGhpcyBwcm9ibGVtLiAKCmBgYHtyfQpucm93KGRmKQpgYGAKdGhlcmUgYXJlIDEzMzggZGF0YSBwb2ludHMgaW4gdGhlIGRhdGEgc2V0LCB0aGlzIG1pZ2h0IGJlIHBvc3NpYmx5IGVub3VnaCB0byBtYWtlIGEgcHJlZGljdGlvbi4KCnRoZSBjdXJyZW50IGRhdGEgaGFzIGF0dHJpYnV0ZXMgd2hpY2ggaGF2ZSBhIHZlcnkgbGVzcyBjb3JyZWxhdGlvbiB3aXRoIHRoZSBkZXBlbmRlbnQgYXR0cmlidXRlLCB0aHVzIHdlIG1pZ2h0IG5lZWQgYWRkaXRpb25hbCBpbmRlcGVuZGVudCBhdHRyaWJ1dGVzIHRvIG1ha2UgYmV0dGVyIHByZWRpY3Rpb25zLgo=